package asem.ast.expresiones;

import genc.GenC;

import java.util.LinkedList;

import alex.Token;
import asem.TablaSimbolos;
import asem.ast.MetodosComunes;
import asem.ast.sentencias.NodoBloque;
import asem.excepciones.ExcepcionEntidadNoDeclarada;
import asem.tablaSimbolos.Clase;
import asem.tablaSimbolos.tipo.Tipo;
import asem.tablaSimbolos.tipo.TipoClase;
import asem.tablaSimbolos.tipo.TipoMetodo;

public class NodoNuevoObjeto extends NodoPrimario {
	protected Token identificador;
	protected LinkedList<NodoExpresion> argsActuales;
	protected NodoLlamadaEncadenada cadenaId;

	public NodoNuevoObjeto(Token token, LinkedList<NodoExpresion> args,
			NodoLlamadaEncadenada lista) {
		identificador = token;
		argsActuales = args;
		cadenaId = lista;
	}

	@Override
	public TipoMetodo chequeoSentencias(NodoBloque contenedor) {
		Clase c = TablaSimbolos.tabla.getClase(identificador.getLexema());
		if (c == null)
			throw new ExcepcionEntidadNoDeclarada(identificador,
					identificador.getLexema(), "clase");

		GenC.gen.crearObjeto(
				Integer.toString(c.getAtributosDeInstancia().size() + 1),
				c.getLabelVT());

		MetodosComunes.chequeoArgs(c.getConstructor(), argsActuales,
				contenedor, false);

		GenC.gen.call(c.getConstructor().getLabel(),
				"Apilo el label del constructor de la clase " + c.getNombre()
						+ " y realizo la llamada");

		TipoMetodo retorno = new TipoClase(c.getIdentificador());

		if (cadenaId != null)
			retorno = cadenaId.chequeoSentencias(contenedor, (Tipo) retorno);

		return retorno;
	}
}
